package com.sxt.server.handler;

import com.sxt.server.common.model.Jt808Msg;
import com.sxt.server.server.WebSocketServer;
import com.sxt.server.util.NettySession;

import cn.hutool.json.JSONUtil;

import com.sxt.server.common.JT808Const;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.timeout.IdleState;
import io.netty.handler.timeout.IdleStateEvent;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Jt808MsgHandler extends ChannelInboundHandlerAdapter {

	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

		log.info("收到Jt808Msg={}", msg);
		Jt808Msg jt808Msg = (Jt808Msg) msg;
		short msgId = jt808Msg.getMsgHeader().getMsgId();
		switch (msgId) {
        case JT808Const.TERNIMAL_MSG_HEARTBEAT:
            //packet = new HeartBeatMsg(bb);
        	// 我们调用writeAndFlush（Object）来逐字写入接收到的消息并刷新线路
    		ctx.writeAndFlush("终端心跳");
            break;
        case JT808Const.TERNIMAL_MSG_LOCATION:
            //packet = new LocationMsg(bb);
        	//发送到Websocket，广播
        	WebSocketServer.BroadCastInfo(JSONUtil.toJsonStr(jt808Msg),null);
        	log.warn(JSONUtil.toJsonStr(jt808Msg));
        	// 我们调用writeAndFlush（Object）来逐字写入接收到的消息并刷新线路
    		ctx.writeAndFlush("位置信息汇报");
            break;
        case JT808Const.TERNIMAL_MSG_REGISTER:
            //packet = new RegisterMsg(bb);
        	// 我们调用writeAndFlush（Object）来逐字写入接收到的消息并刷新线路
    		ctx.writeAndFlush("终端注册");
            break;
        case JT808Const.TERNIMAL_MSG_AUTH:
            //packet = new AuthMsg(bb);
        	// 我们调用writeAndFlush（Object）来逐字写入接收到的消息并刷新线路
    		ctx.writeAndFlush("终端鉴权");
            break;
        case JT808Const.TERNIMAL_MSG_LOGOUT:
            //packet = new LogOutMsg(bb);
        	// 我们调用writeAndFlush（Object）来逐字写入接收到的消息并刷新线路
    		ctx.writeAndFlush("终端注销");
            break;
        default:
           // packet = new DataPacket(bb);
        	// 我们调用writeAndFlush（Object）来逐字写入接收到的消息并刷新线路
    		ctx.writeAndFlush("");
            break;
    }
		
		String sessionID = jt808Msg.getMsgHeader().getTerminalPhone();

		

		// 保存客户端与 Channel 之间的关系
		 NettySession.put(sessionID, ctx.channel());
	}

	/**
	 * 取消绑定
	 * 
	 * @param ctx
	 * @throws Exception
	 */
	@Override
	public void channelInactive(ChannelHandlerContext ctx) throws Exception {
		NettySession.remove(ctx.channel());
	}

	@Override
	public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
		if (evt instanceof IdleStateEvent) {
			IdleStateEvent idleStateEvent = (IdleStateEvent) evt;
			if (idleStateEvent.state() == IdleState.READER_IDLE) {
				log.info("已经50秒没有收到信息！");
				// 向客户端发送消息
			}
		}
		super.userEventTriggered(ctx, evt);
	}
}
